package leetcode;

/*
463. 岛屿的周长
给定一个包含 0 和 1 的二维网格地图，其中 1 表示陆地 0 表示水域。
网格中的格子水平和垂直方向相连（对角线方向不相连）。整个网格被水完全包围，但其中恰好有一个岛屿（或者说，一个或多个表示陆地的格子相连组成的岛屿）。
岛屿中没有“湖”（“湖” 指水域在岛屿内部且不和岛屿周围的水相连）。格子是边长为 1 的正方形。网格为长方形，且宽度和高度均不超过 100 。计算这个岛屿的周长。
示例 :
输入:
[[0,1,0,0],
 [1,1,1,0],
 [0,1,0,0],
 [1,1,0,0]]
输出: 16
解释: 它的周长是下面图片中的 16 个黄色的边：
*/

public class problems_463 {
    public static void main(String[] args) {
        System.out.println(new Solution().islandPerimeter(new int[][]{
                {0, 1, 0, 0},
                {1, 1, 1, 0},
                {0, 1, 0, 0},
                {1, 1, 0, 0}
        }));
    }

    static class Solution {
        int xLength = 0, yLength = 0;
        public int islandPerimeter(int[][] grid) {
            // 寻找起始点
            int ret = 0;
            xLength = grid.length;
            yLength = grid[0].length;
            for (int i = 0; i < xLength; i++) {
                for (int j = 0; j < yLength; j++) {
                    if (grid[i][j] == 1) {
                        ret += findLenNum(grid, i, j);
                    }
                }
            }
            return ret;
        }

        // 判断线
        private int findLenNum(int[][] grid, int x, int y) {
            int ret = 0;
            if (x <= 0 || grid[x - 1][y] != 1) ret++;
            if (x >= xLength - 1 || grid[x + 1][y] != 1) ret++;
            if (y <= 0 || grid[x][y - 1] != 1) ret++;
            if (y >= yLength - 1 || grid[x][y + 1] != 1) ret++;
            return ret;
        }
    }
}